import 'package:flutter/material.dart';

/// 订单类型策略接口
///
/// 定义了根据不同订单类型获取特定UI属性（如颜色和标签）的行为。
/// 这种设计模式将UI决策逻辑从视图中分离出来，提高了代码的可维护性和可扩展性。
abstract class OrderTypeStrategy {
  /// 获取订单类型的品牌颜色
  Color getColor();

  /// 构建订单类型的标签小部件
  ///
  /// - [type] 订单类型字符串
  Widget buildTag(String type);
}

/// 自营订单策略
class SelfOperatedStrategy implements OrderTypeStrategy {
  @override
  Color getColor() => const Color(0xFF00704A); // Starbucks Green

  @override
  Widget buildTag(String type) {
    return _buildDefaultTag(type, getColor());
  }
}

/// 京东订单策略
class JdStrategy implements OrderTypeStrategy {
  @override
  Color getColor() => Colors.red;

  @override
  Widget buildTag(String type) {
    return _buildDefaultTag(type, getColor());
  }
}

/// 饿了么订单策略
class ElemeStrategy implements OrderTypeStrategy {
  @override
  Color getColor() => Colors.blue;

  @override
  Widget buildTag(String type) {
    return _buildDefaultTag(type, getColor());
  }
}

/// 美团订单策略
class MeituanStrategy implements OrderTypeStrategy {
  @override
  Color getColor() => Colors.orange;

  @override
  Widget buildTag(String type) {
    return _buildDefaultTag(type, getColor());
  }
}

/// 默认订单策略
class DefaultStrategy implements OrderTypeStrategy {
  @override
  Color getColor() => Colors.grey;

  @override
  Widget buildTag(String type) {
    return _buildDefaultTag(type, getColor());
  }
}

/// 订单策略工厂
///
/// 根据订单类型字符串返回相应的策略实例。
/// 如果找不到匹配的策略，则返回默认策略。
class OrderStrategyFactory {
  static OrderTypeStrategy getStrategy(String type) {
    switch (type) {
      case '自营订单':
        return SelfOperatedStrategy();
      case '京东订单':
        return JdStrategy();
      case '饿了么订单':
        return ElemeStrategy();
      case '美团订单':
        return MeituanStrategy();
      default:
        return DefaultStrategy();
    }
  }
}

/// 默认标签构建方法
///
/// - [type] 订单类型字符串
/// - [color] 标签颜色
Widget _buildDefaultTag(String type, Color color) {
  return Container(
    padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
    decoration: BoxDecoration(
      color: color,
      borderRadius: BorderRadius.circular(5),
    ),
    child: Text(
      type,
      style: const TextStyle(
          color: Colors.white, fontSize: 12, fontWeight: FontWeight.bold),
    ),
  );
}